package eleventh.System类;

/**
 * Java中有垃圾自动收集机制，可以不定期的释放Java中的垃圾空间，而且之前Runtime的时候已经说了如何进行垃圾空间的释放。
 * 在System类中也有一个gc()方法，此方法也可以进行垃圾收集，而且此方法实际上是对Runtime类中的gc()方法的封装，功能与其类似。
 * 但是此处说的是如何对一个对象进行回收。一个对象如果不再被任何栈内存所引用，那么此对象就可以成为垃圾对象，等待被回收。
 * 实际上，等待的时间是不确定的，所以此时就可以调用System.gc()方法进行垃圾回收。
 * 提示：开发中的垃圾收集基本上都是由系统自动完成的，除非特殊情况，一般都很少直接调用gc()方法
 *
 * 如果在一个对象被回收之前要进行某些操作，在Object类中有一个finalize()方法，方法定义如下：
 * public void finalize() throws Throwable
 * 一个子类是需要覆写此方法就可以释放对象之前的某些操作
 */

//观察对象释放
    class Person{
        private String name;
        private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }


    @Override
    public String toString() {
        return "姓名："+this.name+",年龄："+this.age;
    }

    @Override
    public void finalize() throws Throwable {
        System.out.println("对象被释放-->"+this);

    }
}
public class 垃圾对象回收 {
    public static void main(String[] args) {
        Person zs = new Person("张三", 19);
        zs = null;  //断开引用 释放空间
        System.gc();    //强制性释放空间
    }
}
/**
 * 貌似finalize()方法被remove了，结果就不贴出来了
 * 提示:finalize方法抛出的是Throwable异常，所以在调用此方法时候不一定只会在程序运行中产生错误，也要有可能产生JVM错误
 */